package cn.dm.example.singleton;

import cn.dm.annoations.Recommend;
import cn.dm.annoations.ThreadSafe;

/**
 * 枚举模式：最安全
 *
 * 思路:在单例类中定义一个枚举,枚举包含单例类的属性,在枚举默认的私有构造器中初始化单例属性,枚举提供INSTANCE属性主要是供外部通过该实例调用枚举的getInstance方法
 */
@ThreadSafe
@Recommend
public class SingletonExample7 {

    // 私有构造函数
    private SingletonExample7() {

    }

    public static SingletonExample7 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    private enum Singleton {
        INSTANCE;

        private SingletonExample7 singleton;

        // JVM保证这个方法绝对只调用一次(枚举中默认构造方法为private)
        Singleton() {
            singleton = new SingletonExample7();
        }

        public SingletonExample7 getInstance() {
            return singleton;
        }
    }
}
